<?php

namespace Ecom\ProdutosBundle\Controller;

//use Symfony\Bundle\FrameworkBundle\Controller\Controller;
use Sonata\AdminBundle\Controller\CRUDController as Controller;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Method;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Route;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Template;
use Ecom\ProdutosBundle\Entity\Produto;
use Ecom\ProdutosBundle\Form\ProdutoType;
use Symfony\Component\HttpFoundation\RedirectResponse;
use Symfony\Component\HttpFoundation\Response;
use Ecom\ProdutosBundle\Entity\ProdutoAtributo;
use Ecom\ProdutosBundle\Entity\Atributo;

/**
 * Produto controller.
 *
 * @Route("/produto")
 */
class ProdutoController extends Controller {

    /**
     * sobrescreve o método createAction da classe CRUDControler
     * return the Response object associated to the edit action
     *
     * @throws \Symfony\Component\HttpKernel\Exception\NotFoundHttpException
     *
     * @param mixed $id
     *
     * @return \Symfony\Component\HttpFoundation\Response
     */
    public function editAction($id = null) {
        // the key used to lookup the template
        $template = 'ProdutosBundle:Produto:edit.html.twig';
        $id = $this->get('request')->get($this->admin->getIdParameter());
        
        $object = $this->admin->getObject($id);
       
        //echo $this->getRequestContext()->getParameters();

        if (!$object) {
            throw new NotFoundHttpException(sprintf('unable to find the object with id : %s', $id));
        }

        if (false === $this->admin->isGranted('EDIT', $object)) {
            throw new AccessDeniedException();
        }

        $this->admin->setSubject($object);

        $form = $this->admin->getForm();
        $form->setData($object);

        if ($this->get('request')->getMethod() == 'POST') {
            $form->bindRequest($this->get('request'));

            $isFormValid = $form->isValid();

            // persist if the form was valid and if in preview mode the preview was approved
            if ($isFormValid && (!$this->isInPreviewMode() || $this->isPreviewApproved())) {

                $this->cadAtributo($id);
                $this->admin->update($object);
                $this->get('session')->setFlash('sonata_flash_success', 'flash_edit_success');

                if ($this->isXmlHttpRequest()) {
                    return $this->renderJson(array(
                                'result' => 'ok',
                                'objectId' => $this->admin->getNormalizedIdentifier($object)
                            ));
                }
                // redirect to edit mode
                return $this->redirectTo($object);
            }

            // show an error message if the form failed validation
            if (!$isFormValid) {
                $this->get('session')->setFlash('sonata_flash_error', 'flash_edit_error');
            } elseif ($this->isPreviewRequested()) {
                // enable the preview template if the form was valid and preview was requested
                //$templateKey = 'preview';
                $template = $this->admin->getTemplate($templateKey);
            }
        }

        $produtoAtributo = $this->inicioAtributoAction($id);



        $view = $form->createView();

        // set the theme for the current Admin Form
        $this->get('twig')->getExtension('form')->setTheme($view, $this->admin->getFormTheme());

        return $this->render($template, array(
                    'action' => 'edit',
                    'form' => $view,
                    'object' => $object,
                    'produtoAtributos' => $produtoAtributo,
                ));
    }

    /**
     * sobrescreve o método createAction da classe CRUDControler
     * return the Response object associated to the create action
     *
     * @return \Symfony\Component\HttpFoundation\Response
     */
    public function createAction() {
        // the key used to lookup the template
        $template = 'ProdutosBundle:Produto:edit.html.twig';

        if (false === $this->admin->isGranted('CREATE')) {
            throw new AccessDeniedException();
        }

        $object = $this->admin->getNewInstance();

        $this->admin->setSubject($object);

        $form = $this->admin->getForm();
        $form->setData($object);

        if ($this->get('request')->getMethod() == 'POST') {
            $form->bindRequest($this->get('request'));

            $isFormValid = $form->isValid();

            // persist if the form was valid and if in preview mode the preview was approved
            if ($isFormValid && (!$this->isInPreviewMode() || $this->isPreviewApproved())) {
                $this->admin->create($object);
                $this->cadAtributo($object->getId());
                if ($this->isXmlHttpRequest()) {
                    return $this->renderJson(array(
                                'result' => 'ok',
                                'objectId' => $this->admin->getNormalizedIdentifier($object)
                            ));
                }

                $this->get('session')->setFlash('sonata_flash_success', 'flash_create_success');
                // redirect to edit mode
                return $this->redirectTo($object);
            }

            // show an error message if the form failed validation
            if (!$isFormValid) {
                $this->get('session')->setFlash('sonata_flash_error', 'flash_create_error');
            } elseif ($this->isPreviewRequested()) {
                // pick the preview template if the form was valid and preview was requested
                //$templateKey = 'preview';
                $template = $this->admin->getTemplate($templateKey);
            }
        }

        $view = $form->createView();

        // set the theme for the current Admin Form
        $this->get('twig')->getExtension('form')->setTheme($view, $this->admin->getFormTheme());

        return $this->render($template, array(
                    'action' => 'create',
                    'form' => $view,
                    'object' => $object,
                    'produtoAtributos' => '',
                ));
    }

    /**
     * sobrescreve o método deleteAction da classe CRUDControler
     * return the Response|RedirectResponse
     * 
     * @param mixed $id
     *
     * @return Response|RedirectResponse
     */
    public function deleteAction($id) {
        $id = $this->get('request')->get($this->admin->getIdParameter());
        $object = $this->admin->getObject($id);

        if (!$object) {
            throw new NotFoundHttpException(sprintf('unable to find the object with id : %s', $id));
        }

        if (false === $this->admin->isGranted('DELETE', $object)) {
            throw new AccessDeniedException();
        }

        if ($this->getRequest()->getMethod() == 'DELETE') {
            try {
                $this->deleteAtributoAction($id);
                $this->admin->delete($object);
                $this->get('session')->setFlash('sonata_flash_success', 'flash_delete_success');
            } catch (ModelManagerException $e) {
                $this->get('session')->setFlash('sonata_flash_error', 'flash_delete_error');
            }

            return new RedirectResponse($this->admin->generateUrl('list'));
        }

        return $this->render('SonataAdminBundle:CRUD:delete.html.twig', array(
                    'object' => $object,
                    'action' => 'delete'
                ));
    }

    
    /**
     * return the Response object associated to the view action
     *
     * @return \Symfony\Component\HttpFoundation\Response
     */
    public function showAction($id = null)
    {
        $id = $this->get('request')->get($this->admin->getIdParameter());

        $object = $this->admin->getObject($id);

        if (!$object) {
            throw new NotFoundHttpException(sprintf('unable to find the object with id : %s', $id));
        }

        if (false === $this->admin->isGranted('VIEW', $object)) {
            throw new AccessDeniedException();
        }

        $this->admin->setSubject($object);
        $produtoAtributos = $this->inicioAtributoAction($id);
        $template = 'ProdutosBundle:Produto:show.html.twig';
       // echo $this->admin->getShowTemplate();
        return $this->render($template, array(
            'action'   => 'show',
            'object'   => $object,
            'elements' => $this->admin->getShow(),
            'produtoAtributos' => $produtoAtributos,
        ));
    }
    
    public function addAtributo() {
        $request = $this->get('request');
        $AtributoNome = $request->request->get('atributoNome');
        $IdForm = $request->request->get('idForm');

        if ($AtributoNome) {
            $DadosAtributo = $this->getDoctrine()->getRepository('ProdutosBundle:Atributo')->findOneByNome($AtributoNome);
            $AtributoNomeLimpo = str_replace(' ', '_', $AtributoNome);
            if ($DadosAtributo) {
                $view = $this->renderView('ProdutosBundle:Produto:edit_form_atributo.html.twig', array('idform' => $IdForm, 'id' => $DadosAtributo->getId(), 'nomeatributo' => $AtributoNomeLimpo, 'nome' => $DadosAtributo->getNome(), 'valor' => ''));
            } else {
                $view = $this->renderView('ProdutosBundle:Produto:edit_form_atributo.html.twig', array('idform' => $IdForm, 'id' => '', 'nomeatributo' => $AtributoNomeLimpo , 'nome' => $AtributoNome, 'valor' => ''));
            }
            $return = array("responseCode" => 200, "dadosAtributo" => $view);
        } else {
            $return = array("responseCode" => 400, "dadosAtributo" => '');
        }
        $return = json_encode($return); //jscon encode the array
        return new Response($return, 200, array('Content-Type' => 'application/json'));
    }

    public function addAtributoEditAction() {
        return $this->addAtributo();
    }

    public function addAtributoCreateAction() {
        return $this->addAtributo();
    }

    /**
     * Cadastra/Edita/Remove Atributos do Produto 
     */
    public function cadAtributo($produtoId) {

        $produto = $this->admin->getObject($produtoId);

        $dadosAtributos = array();
        $dadosAtributos = $this->get('request')->get($this->get('request')->query->get('uniqid') . '_atributo');
        $idAtributos = array();
        if (is_array($dadosAtributos)) {
            $em = $this->getDoctrine()->getEntityManager();

            $produtoAtributos = $this->getDoctrine()->getRepository('ProdutosBundle:ProdutoAtributo')->findBy(array('produto' => $produtoId));


            foreach ($dadosAtributos as $dadoAtr) {
                if ($dadoAtr['id']) {
                    $atributo = $this->getDoctrine()->getRepository('ProdutosBundle:Atributo')->find($dadoAtr['id']);
                    $idAtributos[] = $dadoAtr['id'];
                } else {
                    $atributo = new Atributo();
                    $atributo->setNome($dadoAtr['nome']);
                    $em->persist($atributo);
                    $em->flush();
                }


                $produtoAtributo = $this->getDoctrine()->getRepository('ProdutosBundle:ProdutoAtributo')->findOneBy(array('produto' => $produtoId, 'atributo' => $atributo->getId()));
                if ($produtoAtributo) {
                    $produtoAtributo->setValor($dadoAtr['valor']);
                } else {
                    $produtoAtributo = new ProdutoAtributo();
                    $produtoAtributo->setAtributo($atributo);
                    $produtoAtributo->setProduto($produto);
                    $produtoAtributo->setValor($dadoAtr['valor']);
                }
                $em->persist($produtoAtributo);
                $em->flush();
            }

            foreach ($produtoAtributos as $produtoAtributo) {
                if (!in_array($produtoAtributo->getAtributo()->getId(), $idAtributos)) {
                    $produtoAtributoRemover = $this->getDoctrine()->getRepository('ProdutosBundle:ProdutoAtributo')->find($produtoAtributo->getId());
                    $em->remove($produtoAtributoRemover);
                    $em->flush();
                }
            }
        }
    }

    /**
     * Retorna os Atributos já cadastrados para o Produto, com os respectivos Valores
     * @return array() ProdutoBundle/ProdutoAtributo 
     */
    public function inicioAtributoAction($produtoId) {
        $produtoAtributos = $this->getDoctrine()->getRepository('ProdutosBundle:ProdutoAtributo')->findBy(array('produto' => $produtoId));
        $produtosRetorno = array();
        foreach ($produtoAtributos as $produtoAtributo) {
            $produto['id'] = $produtoAtributo->getAtributo()->getId();
            $produto['nome'] = $produtoAtributo->getAtributo()->getNome();
            $produto['nomeatributo'] = str_replace(' ', '_', $produtoAtributo->getAtributo()->getNome());
            $produto['valor'] = $produtoAtributo->getValor();
            $produtosRetorno[] = $produto;
        }
        
        return $produtosRetorno;
    }

    public function deleteAtributoAction($produtoId) {
        $em = $this->getDoctrine()->getEntityManager();
        $produtoAtributos = $this->getDoctrine()->getRepository('ProdutosBundle:ProdutoAtributo')->findBy(array('produto' => $produtoId));
        foreach ($produtoAtributos as $produtoAtributo) {
            $em->remove($produtoAtributo);
            $em->flush();
        }
    }
    
    
    
    
    public function addModelo() {
        $request = $this->get('request');
        $idModelo = $request->request->get('idModelo');
        $idForm = $request->request->get('idForm');
        if($idModelo){
            $DadosModelo = $this->getDoctrine()->getRepository('ProdutosBundle:ModeloAtr')->find($idModelo);
            if($DadosModelo->getAtributo()){
                $view = '';
                foreach ($DadosModelo->getAtributo() as $Modelo) {
                     $view .= $this->renderView('ProdutosBundle:Produto:edit_form_atributo.html.twig', 
                             array('idform' => $idForm, 'id' => $Modelo->getId(), 
                                   'nomeatributo' => str_replace(' ', '_',$Modelo->getNome()), 
                                   'nome' => $Modelo->getNome(), 
                                   'valor' => ''));
                }
                $return = array("responseCode" => 200, "dadosModelo" => $view);
            }else{
                $return = array("responseCode" => 400, "dadosModelo" => '');
            }
            
        }else{
            $return = array("responseCode" => 400, "dadosModelo" => '');
        }
        
        $return = json_encode($return); //jscon encode the array
        return new Response($return, 200, array('Content-Type' => 'application/json'));
    }

    public function addModeloEditAction() {
        return $this->addModelo();
    }

    public function addModeloCreateAction() {
        return $this->addModelo();
    }

    
}
